<?php

require_once(BaseConfig::LoadClass('conecta.class.php'       ));
require_once(BaseConfig::LoadClass('operaciones_db.class.php'));

/**
 * Clase que maneja configuraciones en la base de datos mediante llaves y valores
 * (Muy al estilo de wordpress)
 */
class Config {
  /**
   * @var Conecta
   */
  var $oConecta;

  function Config() {
    $this->oConecta = new Conecta();
  }

  /**
   * Función que regresa el valor de configuración pedido
   * 
   * @param  String $strClave Clave que se buscará
   * @param  String $strDefault Valor qu se regresará si dicha clave no existe o si está vacia
   *
   * @return String El valor de configuración o $strDefault si no existe dicho valor o está vacio.
   */
  function Get($strClave, $strDefault = '') {
    if(!$this->CodeExists($strClave)) {
      return $strDefault;
    }

    $strConsulta = 'SELECT valor FROM configuracion WHERE clave = \'' . OperacionesDB::CambioValoresNoPosiblesDB($strClave) . '\'  ORDER BY id_configuracion DESC LIMIT 1';
    $this->oConecta->Consulta($strConsulta);
    if($this->oConecta->Field('valor') == '') {
      return $strDefault;
    } else {
      return $this->oConecta->Field('valor');
    }
  }

  /**
   * Función que verifica si una clave existe en la configuración
   *
   * @param  String $strClave Clave que se verificará
   * 
   * @return boolean
   */
  function CodeExists($strClave) {
    $strConsulta = 'SELECT id_configuracion FROM configuracion WHERE clave = \'' . OperacionesDB::CambioValoresNoPosiblesDB($strClave) . '\' ORDER BY id_configuracion DESC LIMIT 1';
    $this->oConecta->Consulta($strConsulta);
    if($this->oConecta->Field('id_configuracion')) {
      return true;
    } else {
      return false;
    }
  }

  /**
   * Función que guarda un valor nuevo en la configuración o lo actualiza si ya existe la clave
   *
   * @param String $strClave Clave con la que se guardará el valor
   * @param String $strValor Valor que se guardará
   */
  function Set($strClave, $strValor) {
    if($this->CodeExists($strClave)) {
      $strConsulta = 'UPDATE configuracion SET valor = \'' . OperacionesDB::CambioValoresNoPosiblesDB($strValor) . '\' WHERE clave = \'' . OperacionesDB::CambioValoresNoPosiblesDB($strClave) . '\'';
    } else {
      $strConsulta = 'INSERT INTO configuracion (clave, valor) VALUES (\'' . OperacionesDB::CambioValoresNoPosiblesDB($strClave) . '\', \'' . OperacionesDB::CambioValoresNoPosiblesDB($strValor) . '\')';
    }
    $this->oConecta->Consulta($strConsulta);
  }

  /**
   * Función que regresa un arreglo de la configuraciòn. El arreglo se forma separando cada termino por un |
   *
   * @param String $strClave Clave por la que se buscará el valor
   * @param String $strValoresDef Valores default que se encontrarán
   *
   * @return Array Arreglo con las opciones pedidas
   */
  function GetArray($strClave, $strValoresDef = '') {
    $strArrPreprocesed = $this->Get($strClave, $strValoresDef);
    if($strArrPreprocesed == '') {
      return Array();
    }
    $arrRet = explode('|', $strArrPreprocesed);
    return $arrRet;
  }

  /**
   * Función que guarda un arreglo en la configuración. El arreglo se convierte en cadena uniendo cada elemento mediante |
   *
   * @param String $strClave Clave que se guardará en la base de datos
   * @param Array $arrValores Valores que se guardarán
   */
  function SetArray($strClave, $arrValores) {
    $strArrPreprocesed = join('|', $arrValores);
    $this->Set($strClave, $strArrPreprocesed);
  }
}
?>